package com.atguigu.gmall.common.util;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author BrookPeng
 * @Date 2020/12/4 18:28
 * @Version 1.0
 *
 * Feign远程调用时候的拦截器
 * 执行步骤
 * 1、远程调用的时候执行RequestInterceptor接口实现类(FeignInterceptor)中的apply方法中的代码
 * 2、执行远程调用
 *
 * 实例化 spring框架 spring容器对某些bean 进行实例化
 */
public class FeignInterceptor implements RequestInterceptor {

    // 远程调用 之前要执行的代码所在的方法
    @Override
    public void apply(RequestTemplate requestTemplate) {

        // 浏览器->旧请求->页面微服务->新请求01->购物车微服务->新请求02
        // 获取新请求01
        ServletRequestAttributes servletRequestAttributes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (servletRequestAttributes != null) {
            HttpServletRequest request = servletRequestAttributes.getRequest();
            if (request != null) {
                // 新请求02:requestTemplate
                // 将新请求01中的用户ID转移到新请求02头中
                String userId = request.getHeader("userId");
                if (!StringUtils.isEmpty(userId)) {
                    // 登陆用户
                    requestTemplate.header("userId", userId);
                }
                String userTempId = request.getHeader("userTempId");
                if (!StringUtils.isEmpty(userTempId)) {
                    // 临时用户
                    requestTemplate.header("userTempId", userTempId);
                }
            }
        }
    }
}
